return map(lambda x: x.split('='),
filter(lambda x: x != '', opts.split(',')))
+def append_default_pci_opts(opts, defopts):
+ optsdict = dict(opts)
+ return opts + filter(lambda (k, v): not optsdict.has_key(k), defopts)
+
def pci_opts_list_to_sxp(list):
return dev_dict_to_sxp({'opts': list})
template['domain'] = "0x%04x" % domain
template['bus'] = "0x%02x" % int(pci_dev_info['bus'], 16)
template['slot'] = "0x%02x" % int(pci_dev_info['slot'], 16)
- template['key'] = pci_dev_str
+ template['key'] = pci_dev_str.split(',')[0]
if pci_dev_info['opts'] != '':
template['opts'] = split_pci_opts(pci_dev_info['opts'])
check_pci_opts(template['opts'])
from xen.util import xsconstants
from xen.util import mkdir
from xen.util.pci import serialise_pci_opts, pci_opts_list_to_sxp, \
+ append_default_pci_opts, \
pci_dict_to_bdf_str, pci_dict_to_xc_str, \
pci_convert_sxp_to_dict, pci_convert_dict_to_sxp, \
pci_dict_cmp, PCI_DEVFN, PCI_SLOT, PCI_FUNC, parse_hex
if self.domid is not None:
opts = ''
+ optslist = []
+ pci_defopts = []
+ if 'pci_msitranslate' in self.info['platform']:
+ pci_defopts.append(['msitranslate',
+ str(self.info['platform']['pci_msitranslate'])])
+ if 'pci_power_mgmt' in self.info['platform']:
+ pci_defopts.append(['power_mgmt',
+ str(self.info['platform']['pci_power_mgmt'])])
if new_dev.has_key('opts'):
- opts = ',' + serialise_pci_opts(new_dev['opts'])
+ optslist += new_dev['opts']
+
+ if optslist or pci_defopts:
+ opts = ',' + serialise_pci_opts(
+ append_default_pci_opts(optslist, pci_defopts))
bdf_str = "%s@%02x%s" % (pci_dict_to_bdf_str(new_dev),
int(new_dev['vdevfn'], 16), opts)
"""@see DevController.getDeviceDetails"""
back = {}
pcidevid = 0
+ pci_defopts = []
+
+ if 'pci_msitranslate' in self.vm.info['platform']:
+ pci_defopts.append(['msitranslate',
+ str(self.vm.info['platform']['pci_msitranslate'])])
+ if 'pci_power_mgmt' in self.vm.info['platform']:
+ pci_defopts.append(['power_mgmt',
+ str(self.vm.info['platform']['pci_power_mgmt'])])
+
for pci_config in config.get('devs', []):
domain = parse_hex(pci_config.get('domain', 0))
bus = parse_hex(pci_config.get('bus', 0))
vdevfn = parse_hex(pci_config.get('vdevfn', \
'0x%02x' % AUTO_PHP_SLOT))
+ optslist = []
if pci_config.has_key('opts'):
- opts = serialise_pci_opts(pci_config['opts'])
+ optslist += pci_config['opts']
+ if optslist or pci_defopts:
+ opts = serialise_pci_opts(
+ append_default_pci_opts(optslist, pci_defopts))
back['opts-%i' % pcidevid] = opts
back['dev-%i' % pcidevid] = "%04x:%02x:%02x.%01x" % \
back['num_devs']=str(pcidevid)
back['uuid'] = config.get('uuid','')
- if 'pci_msitranslate' in self.vm.info['platform']:
- back['msitranslate']=str(self.vm.info['platform']['pci_msitranslate'])
- if 'pci_power_mgmt' in self.vm.info['platform']:
- back['power_mgmt']=str(self.vm.info['platform']['pci_power_mgmt'])
return (0, back, {})